<webpack>简介以及相关概念
作者为什么要开发webpack
- 为了实现代码分割功能
为什么要构建
- 开发分工变化:单页面应用、越来越复杂、文件越来越多
- 框架演变:由js库变为前端框架、模块化开发、新的语法特性、逻辑分层、MVVM框架
- 语言的发展:HTML(W3C)、css->less\sass\stylus预处理工具、js->ts\模块化\ES6
- 环境的变化:前端代码可以使用node环境服务
- 社区变化:github、npm 包管理需要构建
- 工具的变化:grunt\gulp\webpack\rollup
为什么要webpack
- Vue-cli\React-starter\Angular-cli 都是webpack构建的
- 支持Code-Spliting(代码分割)
- 支持模块化
模块化开发
- 命名空间->commonjs(只能在nodejs服务端使用)->AMD|CMD|UMD->ES6 module
- 命名空间
1 | var NameSpace = {} |
commonjs
- 一个文件是一个模块
- 通过 module.exports 暴露模块接口
AMD
- 使用 define 定义模块、使用 require 加载模块
- RequireJS
- 依赖前置,提前执行
1 | define(['jquery'], function ($) { |
CMD
- SeaJS
- 尽可能懒执行
1 | define(function (require, exports, module) { |
UMD(Universal Module Definition)通用模块解决方案
- 判断是否支持AMD
- 判断是否支持commonJS
- 如果都没有,使用全局变量
1 | (function (root, factory) { |
ESM
- 一个文件一个模块 export/import
webpack支持的模块化
- AMD\ES Module(推荐)\CommonJS
css模块化
- CSS设计模式:OOCSS\SMACSS\Atomic css\MCSS\AMCSS\BEM
- CSS Module:
webpack简介
功能进化
- v2版本
- Tree Shaking
- ES Module
- 动态 import
- 新的文档
- v3版本
- Scope Hoisting(作用于提升)打包后代码性能提升
- Magic Comments (配合动态import使用) 指定打包后的文件名
- v4版本
核心概念
- entry
- 代码入口、打包入口、单个或者多个
1 | module.exports = { |
- output
- 对打包生成文件的描述、一个或者多个
- https://www.webpackjs.com/configuration/output/
- Loaders
- 处理文件、转化为模块
- https://www.webpackjs.com/loaders/
- Plugins
- 参与整个打包过程
- https://www.webpackjs.com/plugins/
名词
- chunk 代码块
- Bundle 打包后的文件
- Module 模块